#include <bsp/bsp_uart6.h>


#define DBG_TAG "uart6"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define UART6_NAME                 "uart6"

// 用于接收消息的信号量
static struct rt_semaphore rx_sem6;
static rt_device_t serial6;

static uint8_t rx6_buff[1] = {0};

// 接收数据回调函数
static rt_err_t uart6_rx_ind(rt_device_t dev, rt_size_t size)
{
    // 串口接收到数据后产生中断，调用此回调函数，然后发送接收信号量
    if(size > 0 )
    {
        rt_device_read(serial6, 0, rx6_buff, size);
        rt_sem_release(&rx_sem6);
    }

    return RT_EOK;
}

bool bsp_uart6_tx_transmit(uint8_t* buff, uint16_t len)
{
    rt_device_write(serial6, 0, buff, len);
    return true;
}

int32_t bsp_uart6_rx_transmit(uint8_t* buff, int32_t wait)
{
//    char ch;
//    while (rt_device_read(serial, 0, &ch, 1) == 0)
//    {
//        rt_sem_control(&rx_sem, RT_IPC_CMD_RESET, RT_NULL);
//        if( rt_sem_take(&rx_sem, wait) != RT_EOK)
//            return 0;
//    }
//    buff[0] = ch;

    if( rt_sem_take(&rx_sem6, wait) != RT_EOK)
        return 0;
    buff[0] = rx6_buff[0];
//    rt_kprintf("%x \n",buff[0]);
    return 1;
}

int bsp_uart6_init(void)
{
//    char str[] = "hello RT-Thread!\r\n";

    struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;  /* 初始化配置参数 */

    // step1：查找串口设备
    serial6 = rt_device_find(UART6_NAME);

    // step2：修改串口配置参数
    config.baud_rate = BAUD_RATE_38400;//BAUD_RATE_115200;      //修改波特率为 115200
    config.data_bits = DATA_BITS_8;           //数据位 8
    config.stop_bits = STOP_BITS_1;           //停止位 1
    config.bufsz     = 128;                   //修改缓冲区 buff size 为 128
    config.parity    = PARITY_NONE;           //无奇偶校验位

    // step3：控制串口设备。通过控制接口传入命令控制字，与控制参数
    rt_device_control(serial6, RT_DEVICE_CTRL_CONFIG, &config);

    // 初始化信号量
    rt_sem_init(&rx_sem6, "uart6_rx", 0, RT_IPC_FLAG_FIFO);

    // 设置接收回调函数
    rt_device_set_rx_indicate(serial6, uart6_rx_ind);

    // step4：打开串口设备。以中断接收及轮询发送模式打开串口设备
    rt_device_open(serial6, RT_DEVICE_FLAG_INT_RX);

//    rt_device_write(serial6, 0, str, (sizeof(str) - 1));

    return RT_EOK;
}
// 导出到 msh 命令列表中
//INIT_COMPONENT_EXPORT(bsp_uart3_init);
